#pragma once

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;
/*HJJ QQ479287006
 *给你一个字符串 s ，请你统计并返回这个字符串中 回文子串 的数目。

回文字符串 是正着读和倒过来读一样的字符串。

子字符串 是字符串中的由连续字符组成的一个序列。

具有不同开始位置或结束位置的子串，即使是由相同的字符组成，也会被视作不同的子串。

 

示例 1：

输入：s = "abc"
输出：3
解释：三个回文子串: "a", "b", "c"
示例 2：

输入：s = "aaa"
输出：6
解释：6个回文子串: "a", "a", "a", "aa", "aa", "aaa"

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/palindromic-substrings
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */
//for 循环暴力应该也可以吧
int countSubstrings(string s) {
    int maxV=0;
    vector<vector<bool>> dp(s.size() + 1, vector(s.size() + 1, false));

    //low
    for(int i= s.size() - 1; i >= 0; i--){
        //high 比low index 要大
        for(int j=i; j < s.size(); j++){
            //刚开始没加这句  所有的都是在这句基础性上进行的
            if (s[i] != s[j])
                continue;
            if (j - i <= 1) {
                dp[i][j] = true;
                maxV++;
            } else if (dp[i + 1][j - 1]) {
                dp[i][j] = true;
                maxV++;
            }

        }

    }


    return maxV;

}

bool check(string &s, int low, int high) {

    while (low <= high) {
        if (s[low++] != s[high--])
            return false;
    }

    return true;
}


int countSubstrings1(string s) {
    int maxV = 0;
    for (int i = 0; i < s.size(); i++) {

        for (int j = i + 1; j < s.size(); ++j) {

            if (check(s, i, j))
                maxV++;

        }

    }

    return maxV;

}
